

#include "my_array.h"

#include <stdio.h>
#include <stdlib.h>


/**
 * @description: 初始化一个动态数组
 * @param arr 传入外部动态数组变量
 * @param size 数组大小
 * @return 1：初始化成功
 */
unsigned int array_initArray(my_array* arr, int size)
{
    arr->head = (ArrDataType*) malloc(size * sizeof(ArrDataType) );
    if(arr->head == NULL){
        exit(0);
    }

    arr->length = 0;
    arr->size = size;

    return 1;
}


/**
 * @description: 删除整个数组
 * @param arr 传入外部动态数组变量
 * @return 
 */
void array_destroyArray(my_array* arr)
{
    free(arr->head);
    arr->head=NULL;
    arr->length = 0;
    arr->size=0;
}


/**
 * @description: 清空数组
 * @param arr
 * @return 
 */
void array_clearList(my_array* arr)
{
    arr->length = 0;
}


/**
 * @description: 判断该数组是否为空
 * @param arr
 * @return 1：为空
 */
unsigned char array_isEmpty(my_array* arr)
{
    if(arr->length) return 0;
    else    return 1;
}

/**
 * @description: 获取某个位置的元素
 * @param arr
 * @param index
 * @return 
 */
ArrDataType array_getElem(my_array* arr, unsigned int index)
{
    if(arr->head==NULL || arr->length < index ){
        exit(0);
    }

    return *(arr->head+index);
}


/**
 * @description: 添加某个元素到数组的第i个位置
 * @param arr 数组
 * @param index 元素被添加的位置
 * @param data 被添加的数据
 * @return 1：添加成功
 */
unsigned char array_addElem(my_array* arr, unsigned int index, ArrDataType data)
{
    if(index > arr->length)  
        return 0;

    // 该数组是否够长，不够则扩展空间
    if(arr->length + 1 > arr->size){

        ArrDataType* new_base = (ArrDataType*) realloc(arr, (arr->size + (ARR_INC_NUM))* sizeof(ArrDataType) );
        if(!new_base){
            exit(0);
        }

        arr->head = new_base;
        arr->size += (ARR_INC_NUM);
    }

    // 从最后个数据开始往后移动一个位置
    int i = arr->length;
    while (i!=index)
    {
        *(arr->head + i + 1) = *(arr->head + i );
        --i;
    }
    
    *(arr->head + i) = data;
    arr->length +=1;

    return 1;
}


/**
 * @description: 删除第index个位置的元素
 * @param arr
 * @param index 元素位置
 * @return 
 */
unsigned char array_delElem(my_array* arr, unsigned int index)
{
    if(index >= arr->length || arr->head == NULL)
        return 0;

    ArrDataType* ptr = arr->head + index;

    while (ptr < arr->head + arr->length)
    {
        *ptr = *(ptr + 1);
        ++ptr;
    }
    
    arr->length -= 1;

    return 1;
}


/**
 * @description: 修改某个元素的值
 * @param arr
 * @param index 元素位置
 * @param data 被修改的位置
 * @return 
 */
unsigned char array_setElem(my_array* arr, unsigned int index, ArrDataType data)
{
    if(arr->head==NULL || arr->length <= index)
        return 0;
    
    *(arr->head + index) = data;
    return 1;
}

/**
 * @description: 查找某个元素是否在数组中，若在则返回所在位置，不在则返回-1(0xffffffff)
 * @param arr
 * @param data
 * @return 
 */
unsigned int array_locateElem(my_array* arr, ArrDataType data)
{
    if(arr->head==NULL)
        return 0;

    int i=0;
    while (i < arr->length)
    {
        if( *(arr->head + i) == data ) return i;
        i++;
    }
    
    return -1;

}